package stack

import (
	"algorithms/array"
	"fmt"
	"strings"
)

type ArrayStack[E any] struct {
	array *array.Array[E]
}

func MakeArrayStack[E any]() *ArrayStack[E] {
	return MakeArrayStack0[E](10)
}

func MakeArrayStack0[E any](cap int) *ArrayStack[E] {
	return &ArrayStack[E]{
		array: array.MakeArray0[E](cap),
	}
}

// Pop 栈顶出栈
func (a *ArrayStack[E]) Pop() (E, error) {
	return a.array.RemoveLast()
}

// Push 栈顶压栈
func (a *ArrayStack[E]) Push(e E) error {
	return a.array.AddLast(e)
}

// Peek 查看栈顶元素
func (a *ArrayStack[E]) Peek() (E, error) {
	return a.array.GetLast()
}

// GetSize 查看栈元素数量
func (a *ArrayStack[E]) GetSize() int {
	return a.array.GetSize()
}

// GetCap 查看栈容量
func (a *ArrayStack[E]) GetCap() int {
	return a.array.GetCap()
}

//IsEmpty 栈是否为空
func (a *ArrayStack[E]) IsEmpty() bool {
	return a.array.IsEmpty()
}

func (a *ArrayStack[E]) String() string {
	var sb strings.Builder
	sb.WriteString("Stack: ")
	sb.WriteString("[")
	for i := 0; i < a.array.GetSize(); i++ {
		e, _ := a.array.Get(i)
		sb.WriteString(fmt.Sprintf("%+v", e))
		if i != a.array.GetSize()-1 {
			sb.WriteString(", ")
		}
	}
	sb.WriteString("] stop")
	return sb.String()
}
